package org.jaaksi.plugin.trace

import javassist.ClassPool
import javassist.CtClass
import javassist.CtMethod
import org.gradle.api.Project

class MyInjects {
  //初始化类池
  private final static ClassPool pool = ClassPool.getDefault();

  static void inject(String path, Project project) {
    //将当前路径加入类池,不然找不到这个类
    pool.appendClassPath(path)
    //project.android.bootClasspath 加入android.jar，不然找不到android相关的所有类
    def bootClassPath = project.android.bootClasspath[0].toString()
    //    println "-----------------bootClassPath = $bootClassPath"
    pool.appendClassPath(project.android.bootClasspath[0].toString())
    //引入android.os.Bundle包，因为onCreate方法参数有Bundle
    pool.importPackage("android.os.Bundle")

    File dir = new File(path)
    if (dir.isDirectory()) {
      //遍历文件夹
      dir.eachFileRecurse { File file ->
        String filePath = file.absolutePath
        println("------filePath = " + filePath)
        if (file.getName() == "MainActivity.class") {

          // 获取MainActivity.class fixme 如何自动获取包名
          // 如何在任意类中找到onClick方法
          //          CtClass ctClass = classPool.get('''android.view.View$OnClickListener''')
          CtClass ctClass = pool.getCtClass("org.jaaksi.demo.gradle.MainActivity")
          println("----ctClass = " + ctClass)
          // fixme 解冻？？
          if (ctClass.isFrozen()) {
            ctClass.defrost()
          }

          //获取到OnCreate方法
          CtMethod[] ctMethods = ctClass.getDeclaredMethods("onClick")

          //          println("方法名 = " + ctMethod)

          // todo 插入导包android.widget.Toast
          String insetBeforeStr = """ android.widget.Toast.makeText(this,"我是被插入的Toast代码~!!",android.widget.Toast.LENGTH_SHORT).show();
                                                """
          ctMethods.each { CtMethod ctMethod ->
            //在方法开头插入代码
            ctMethod.insertBefore(insetBeforeStr)
          }

          ctClass.writeFile(path)
          ctClass.detach() //释放
        }
      }
    }
  }
}